/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo;

import clases.Comprobante;
import clases.Serie;
import clases.Usuario;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.ArrayList;

/**
 *
 * @author root
 */
public class MdlComprobante implements Modelo<Comprobante>{

    /**
     * 
     * @param comprobante
     * @param cnx
     * @throws SQLException 
     */
    @Override
    public void insert(Comprobante comprobante, Conexion cnx) throws SQLException {
        String sql = "INSERT INTO comprobante (serie, numero, nombreCliente, fecha, monto, igv, usuario, estado) +"
                + "VALUES (" + comprobante.getSerie().getIdSerie() + ", "
                + comprobante.getNumero() + ", "
                + "'" + comprobante.getNombreCliente() + "', "
                + "'" + comprobante.getFecha().toString() + "', "
                + comprobante.getMonto() + ", "
                + comprobante.getIgv() + ", "
                + comprobante.getUsuario().getIdUsuario() + ", "
                + "'" + comprobante.getEstado() + "');";
        cnx.ejecutar(sql);
    }

    /**
     * 
     * @param cnx
     * @return
     * @throws SQLException 
     */
    @Override
    public int getLastId(Conexion cnx) throws SQLException {
        String sql = "SELECT MAX(idComprobante) FROM comprobante;";
        ResultSet rs = cnx.consultar(sql);
        if (rs.next()) {
            return rs.getInt(1);
        }
        return -1;
    }

    /**
     * 
     * @param comprobante
     * @param cnx
     * @throws SQLException 
     */
    @Override
    public void update(Comprobante comprobante, Conexion cnx) throws SQLException {
        String sql = "UPDATE comprobante SET "
                + "serie = " + comprobante.getSerie().getIdSerie() + ", "
                + "numero = " + comprobante.getNumero() + ", "
                + "nombreCliente = '" + comprobante.getNombreCliente() + "', "
                + "fecha = '" + comprobante.getFecha().toString() + "', "
                + "monto = " + comprobante.getMonto() + ", "
                + "igv = " + comprobante.getIgv() + ", "
                + "usuario = " + comprobante.getUsuario().getIdUsuario() + ", "
                + "estado = '" + comprobante.getEstado() + "' "
                + "WHERE idComprobante = " + comprobante.getIdComprobante();
        cnx.ejecutar(sql);
    }

    /**
     * 
     * @param query
     * @param cnx
     * @return
     * @throws SQLException 
     */
    @Override
    public ArrayList<Comprobante> get(String query, Conexion cnx) throws SQLException {
        ResultSet rs = cnx.consultar(query);
        ArrayList<Comprobante> comprobantes = new ArrayList<>();
        while(rs.next()){
            comprobantes.add(new Comprobante(
                    rs.getInt(1),
                    new Serie(){
                        {
                            this.setIdSerie(rs.getInt(2));
                        }
                    },
                    rs.getInt(3),
                    rs.getString(4),
                    LocalDate.parse(rs.getString(5)),
                    rs.getFloat(6),
                    rs.getFloat(7),
                    new Usuario(){
                        {
                            this.setIdUsuario(rs.getInt(8));
                        }
                    },
                    rs.getString(9).charAt(0)
            ));
        }
        return comprobantes;
    }

    @Override
    public Comprobante get(int id, Conexion cnx) throws SQLException {
        String sql = "SELECT * FROM comprobante WHERE idComprobante LIKE " + id;
        ResultSet rs = cnx.consultar(sql);
        Comprobante comprobante = null;
        if (rs.next()) {
            comprobante = new Comprobante(
                    rs.getInt(1),
                    new Serie(){
                        {
                            this.setIdSerie(rs.getInt(2));
                        }
                    },
                    rs.getInt(3),
                    rs.getString(4),
                    LocalDate.parse(rs.getString(5)),
                    rs.getFloat(6),
                    rs.getFloat(7),
                    new Usuario(){
                        {
                            this.setIdUsuario(rs.getInt(8));
                        }
                    },
                    rs.getString(9).charAt(0)
            );
        }
        return comprobante;
    }
    
}
